#ifndef BOOTLOADER_H
#define BOOTLOADER_H

// 引入STM32F4xx的硬件抽象层头文件，根据具体STM32型号可能需要替换xxx
#include "stm32f4xx_hal.h"  
#include <string.h>
#include <stdint.h>
#include <stdio.h>

#define LOG printf

// ===== 内存地址定义 =====
#define APP1_START_ADDRESS 0x08020000U
#define APP2_START_ADDRESS 0x08040000U
#define BOOT_PARAM_START_ADDRESS 0x0800C000U
#define APP1_SECTOR 5
#define APP2_SECTOR 6
#define BOOT_PARAM_SECTOR 3

enum FLASH_UINT32_ID{//4字节对齐,起始地址0x0800C000U
// =====APP 启动失败次数记录 =====
    BOOT_TO_APP1_FAULT = 0,
    BOOT_TO_APP2_FAULT,
// ===== APP版本号记录 =====
    APP1_VERSION,
    APP2_VERSION
};

// 函数原型声明，以下函数在bootloader.c文件中实现，此处声明以便其他文件调用


//--------------------------不需要修改的代码----------------------------------
// Bootloader主流程函数，负责检查标志并决定跳转等操作
void Bootloader_Run(void);
// 错误处理函数,main.c中的代码
void Error_Handler(void);

//--------------------------可能需要修改的代码----------------------------------
// Bootloader初始化函数，可用于初始化相关硬件资源等
void Bootloader_Init(void);
// 用于擦除应用程序所在Flash扇区的函数，参数为要擦除的扇区编号
void APP_Flash_Erase(uint32_t Sector);
// 用于向Flash中写入应用程序固件数据的函数，参数包括写入起始地址、固件数据缓冲区指针和固件数据大小
void APP_Flash_Write(uint32_t APP_FLAG_ADDRESS,uint8_t *firmware_buffer,uint32_t firmware_size);

#endif /* BOOTLOADER_H */
